/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package datenbank;

import java.sql.*;
import java.util.Vector;
import data.*;



public class kalendereintragMapper {

    private static kalendereintragMapper kalendereintragMapper = null;

    /*
     * statische Methode, die sicherstellt, dass nur eine Instanz von KalendereintragMapper erzeugt wird.
     *
     * @return Das kalendereintragMapper -Objekt.
     */
    public static kalendereintragMapper kalendereintragMapper() {
        if (kalendereintragMapper == null) {
            kalendereintragMapper = new kalendereintragMapper();
        }

        return kalendereintragMapper;
    }
    /**
    * Hier wird ein neues Kalendereintrag (-Objekt) in die Datenbank eingefügt.
    * Dabei wird auch überprüft was die bisher höhste kalendereintrag_ID(der Primärschlüssel) ist.
    *
    * @param fl ist das das zu speichernde Kalendereintrag-Objekt
    * @return das bereits übergebene Objekt, jedoch mit ggf. korrigierter kalendereintrag_ID vom Typ Kalendereintrag
    */

    public Kalendereintrag insert(Kalendereintrag ke) {
        Connection con = DBConnection.connection();

        try {
            Statement stmt = con.createStatement();

            /*
             * Hier wird überprüft welche kalendereintrag_id bisher die höhste ist.
             */
            ResultSet rs = stmt.executeQuery(
                    "SELECT MAX(kalendereintrag_id) AS maxid " +
                    "FROM kalendereintrag");


            if (rs.next()) {
                try {
                    /* Hier wird die bisher höhste vorhandene kalendereintrag_id um +1 erhöht.
                     */
                    ke.set_kalendereintrag_id(rs.getInt("maxid") + 1);

                    stmt = con.createStatement();

                    /* Die tatsächliche Einfügeoperation mit den übergebenden Attributen.
                     */

                    stmt.executeUpdate("INSERT INTO kalendereintrag (kalendereintrag_id, kalender_id, start, ende, titel, ort, beschreibung, kategorie, erstellt_von, erinnerung) VALUES (" +
                            ke.get_kalendereintrag_id() + ",'" +
                            ke.get_kalender_id() + "','" +
                            ke.get_start()+ "','" +
                            ke.get_ende()+ "','" +
                            ke.get_titel()+ "','" +
                            ke.get_ort()+ "','" +
                            ke.get_beschreibung()+ "','" +
                            ke.get_kategorie()+ "','" +
                            ke.get_erstellt_von()+ "','" +
                            ke.get_erinnerung() + "')");


                } catch (Exception ex) {
                    ex.printStackTrace();
                }
            }
        } catch (SQLException e2) {
            e2.printStackTrace();
        }
        /* Rückgabe des angelegten Objekts pe von Typ Kalendereintrag.
         */
        return ke;
    }


    public Kalendereintrag update(Kalendereintrag ke) {
        /* Stellt durch Aufruf der connection() Methode der DBConnection-Klasse, die Verbindung zur Datenbank her. */
        Connection con = DBConnection.connection();

        try {
            // Leeres SQL-Statement stmt wird angelegt.
            Statement stmt = con.createStatement();

            //Statement wird ausgefüllt und als Query an die DB geschickt.
            stmt.executeUpdate("UPDATE kalendereintrag " +
                    "SET kalendereintrag_id=" + ke.get_kalendereintrag_id() + "," +
                    "kalender_id='" + ke.get_kalender_id() + "', " +
                    "start='" + ke.get_start() + "', " +
                    "ende='" + ke.get_ende() + "', " +
                    "titel='" + ke.get_titel() + "', " +
                    "ort='" + ke.get_ort() + "', " +
                    "beschreibung='" + ke.get_beschreibung() + "', " +
                    "kategorie='" + ke.get_kategorie() + "', " +
                    "erastellt_von='" + ke.get_erstellt_von() + "', " +
                    "erinnerung='" + ke.get_erinnerung() + "' " +
                    "WHERE kalendereintrag_id=" + ke.get_kalendereintrag_id());



        } catch (SQLException e2) {
            e2.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
        // das als Parameter übergebende Objekt des Typs Kalendereintrag wird zurückgegeben
        return ke;
    }


    /**
     * Diese Methode löscht alle Daten eines Kalendereintrag- Objekts aus der Datenbank.
     *
     * @param pe ist das zu löschende Objekt
     */

    public void delete(Kalendereintrag ke) {
        Connection con = DBConnection.connection();

        try {
            // Leeres SQL-Statement stmt wird angelegt.
            Statement stmt = con.createStatement();

            // Statement wird ausgefüllt und als Query an die DB geschickt.
            stmt.executeUpdate("DELETE FROM kalendereintrag " +
                    "WHERE kalendereintrag_id=" + ke.get_kalendereintrag_id());

        } catch (SQLException e2) {
            e2.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }


    }

    /*
     * Bei dieser Methode werden alle Kalendereintrag ausgelesen.
     *
     * @return Es wird ein Vektor mit Kalendereintrag-Objekten, d.h. allen in der Datenbank angelegten Kalendereinträge, zurückgegeben.
     * Bei evtl. Exceptions wird ein partiell gefüllter oder ggf.
     * auch leerer Vektor vom Typ Kalendereintrag zurückgeliefert.
     */

    public Vector findAll_kalendereintrag() {
        Connection con = DBConnection.connection();
        Vector result = new Vector();

        try {
            Statement stmt = con.createStatement();


            ResultSet rs = stmt.executeQuery(

                    "SELECT kalendereintrag_id, kalender_id, start, ende, titel, ort, beschreibung, kategorie, erstellt_von, erinnerung " +
                    "FROM kalendereintrag " +
                    "ORDER BY kalendereintrag_id");

            // Für jeden Eintrag im Suchergebnis wird nun ein Kalendereintrag-Objekt ke erstellt.
            while (rs.next()) {
                try {
                    KalendereintragImpl ke = new KalendereintragImpl();
                    ke.set_kalendereintrag_id(rs.getInt("kalendereintrag_id"));
                    ke.set_kalender_id(rs.getInt("kalender_id"));
                    ke.set_start(rs.getDate("start"));
                    ke.set_ende(rs.getDate("ende"));
                    ke.set_titel(rs.getString("titel"));
                    ke.set_ort(rs.getString("ort"));
                    ke.set_beschreibung(rs.getString("beschreibung"));
                    ke.set_kategorie(rs.getString("kategorie"));
                    ke.set_erstellt_von(rs.getInt("erstellt_von"));
                    ke.set_erinnerung(rs.getBoolean("erinnerung"));
                    result.addElement(ke);
                } catch (Exception e) {
                    e.printStackTrace();
                    //Bei einer evtl. Exception wird die while-Schleife abgebrochen.
                    break;
                }

            }
        } catch (SQLException e2) {
            e2.printStackTrace();
        }
        // Ergebnisvektor vom Typ Kalendereintrag wird zurückgeben.
        return result;

    }


    /**
     * Diese Methode sucht die Datenbank nach einem Kalendereintrag mit eingegebener ID.
     *
     * @param kalendereintrag_id ist das Primärschlüsselattribut Kalendereintrag in der Datenbank.
     * @return Das Objekt vom Typ Kalendereintrag, das der id entspricht wird zurückgegeben.
     * null wird zurückgegeben, wenn das Objekt nicht in der Datenbank vorhanden ist.
     * Da es sich um einen Primärschlüssel handelt und dieser somit eindeutig ist, wird genau ein Objekt zurückgegeben.
     */

    public Kalendereintrag findbyid(int id) {
        Connection con = DBConnection.connection();

        try {
            Statement stmt = con.createStatement();

            ResultSet rs = stmt.executeQuery(
                    "SELECT kalendereintrag_id, kalender_id, start, ende, titel, ort, beschreibung, kategorie, erstellt_von, erinnerung FROM kalendereintrag " +
                    "WHERE kalendereinrag_id =" + id);

            /*
             * Da es sich bei id um einen Primärschlüssel handelt, kann max. nur ein Tupel zurückgegeben werden.
             * Es wird geprüft, ob ein Ergebnis vorliegt. Wenn ja werden alle Attribute eines Kalendereintrag (-Objekts)
             * als Typ Kalendereintrag zurückgegeben.
             */
            if (rs.next()) {
                try {
                    KalendereintragImpl ke = new KalendereintragImpl();
                    ke.set_kalendereintrag_id(rs.getInt("kalendereintrag_id"));
                    ke.set_kalender_id(rs.getInt("kalender_id"));
                    ke.set_start(rs.getDate("start"));
                    ke.set_ende(rs.getDate("ende"));
                    ke.set_titel(rs.getString("titel"));
                    ke.set_ort(rs.getString("ort"));
                    ke.set_beschreibung(rs.getString("beschreibung"));
                    ke.set_kategorie(rs.getString("kategorie"));
                    ke.set_erstellt_von(rs.getInt("erstellt_von"));
                    ke.set_erinnerung(rs.getBoolean("erinnerung"));
                    return ke;

                } catch (Exception e) {
                    e.printStackTrace();
                    return null;
                }
            }
        } catch (SQLException e2) {
            e2.printStackTrace();
            return null;
        }

        return null;
    }

//    public Person findbybezeichnung(String bezeichnung) {
//        Connection con = DBConnection.connection();
//
//        try {
//            Statement stmt = con.createStatement();
//
//            ResultSet rs = stmt.executeQuery(
//                    "SELECT fluglinie_ID, bezeichnung FROM Fluglinie " +
//                    "WHERE bezeichnung =" + bezeichnung);
//
//             /*
//             * Da es sich bei id um einen Primärschlüssel handelt, kann max. nur ein Tupel zurückgegeben werden.
//             * Es wird geprüft, ob ein Ergebnis vorliegt. Wenn ja werden die Attribute fluglinie_id,
//             * und bezeichnung ausgelesen und als Typ Fluglinie zurückgegeben.
//             */
//            if (rs.next()) {
//                try {
//
//                    FluglinieImpl fl = new FluglinieImpl();
//                    fl.set_fluglinie_id(rs.getInt("fluglinie_ID"));
//                    fl.set_bezeichnung(rs.getString("bezeichnung"));
//                    return fl;
//
//                } catch (Exception e) {
//                    e.printStackTrace();
//                    return null;
//                }
//            }
//        } catch (SQLException e2) {
//            e2.printStackTrace();
//            return null;
//        }
//
//        return null;
//    }
////    public static void main(String[] args) {
////        FluglinieMapper gui = new FluglinieMapper();
////        gui.findAll_fluglinie();
////        }
}



